-
Notifications
You must be signed in to change notification settings - Fork 28
Preserve insertion order of manually selected utxos if TxOrdering::Untouched
#262
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Preserve insertion order of manually selected utxos if TxOrdering::Untouched
#262
Conversation
Pull Request Test Coverage Report for Build 15884240796Details
💛 - Coveralls |
7f16781
to
b1436ae
Compare
TxOrdering::Untouched
b1436ae
to
dde0b3e
Compare
Since our logic is meant to enforce the precedence of local utxos, it makes sense to keep the test, but I agree there could be a simpler, easy to maintain version of it. ValuedMammal/bdk_wallet@49b5cef |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For consistency with the rest of the codebase I want to stick with the "UTXO" style acronym.
dde0b3e
to
048daa6
Compare
When TxBuilder::ordering is TxOrdering::Untouched, the insertion order of recipients and manually selected UTxOs should be preserved in transaction's output and input vectors respectively. Fixes bitcoindevkit#244
048daa6
to
d6d204b
Compare
Thanks for the review! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ACK d6d204b
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
utACK
I left a question and a single nit, but overall it looks good to me! Agree with the new version of test suggested by VM's, it looks much better.
if let Some(idx) = existing_index { | ||
self.params.utxos.remove(idx); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
question: why is it now being removed ?
// chain | ||
// NOTE: this avoid UTxOs in both required and optional list |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// chain | |
// NOTE: this avoid UTxOs in both required and optional list | |
// chain | |
// NOTE: this avoid UTXOs in both required and optional list |
Description
On my attempt to fix bitcoindevkit/bdk#1794 in bitcoindevkit/bdk#1798, I broke the assumption that insertion order is preserved when
TxBuilder::ordering
isTxOrdering::Untouched
. Some users are relying in this assumption, so here I'm trying to restore it back, without adding a new dependency for this single use case like #252, or creating a new struct just to track this.In this fourth alternative solution I'm going back to use
Vec
to store the manually selected UTxOs.I was reluctant to do it in this way because
HashMap
seems a better solution giving its property of avoiding duplicates, but as we also want to keep the secuential nature of the insertion of UTxOs inTxBuilder
, here is an alternative aligned with that principle.May replace #252
May replace #261 .
Fixes #244
Notes to the reviewers
Also, as I was working on this, I came back to the following tests:
test_prexisting_foreign_utxo_have_no_precedence_over_local_utxo_with_same_outpoint
test_prexisting_local_utxo_have_precedence_over_foreign_utxo_with_same_outpoint
Motivated during the implementation and review of bitcoindevkit/bdk#1798.
Which required the underlying structure to also hold the properties of no duplication for manually selected UTxOs, as the structures were accessed directly for these cases.
The test tries to cover the case when there are two wallets using the same descriptor, one tracks transactions and the other does not. The first passes UTxOs belonging to the second one and this one creates transactions using the
add_foreign_utxo
interface.In this case it was expected for any
LocalUtxo
of the offline wallet to supersede any conflicting foreign UTxO. But, the simulation of this case went against the borrowing constraints of rust.By how costly was to reproduce this behavior for me in the tests, I would like to have second opinions in the feasibility of the test case.
Changelog notice
No public APIs are changed by these commits.
Checklists
Important
This pull request DOES NOT break the existing API
cargo +nightly fmt
andcargo clippy
before committing